<html>
<head>
<link href="../tutorial.css" rel="stylesheet" type="text/css">
</head>
<body>

<div class="header">
The NakedMud Tutorial :: Inheritance
</div>

<!-- content starts here -->
<div class="content-wrap"><div class="content-body-wrap"><div class="content">
<div class="head">Abstract Contents</div>
<div class="info">
You may have noticed that certain zone contents are flagged as abstract. The
very first editor option for rooms, objects, and mobiles is whether or not they
are abstract. If a game content is abstract it means it is a real game
content, but it cannot actually exist in the game on its own. Abstract contents
are used for inheritance, which is the topic of this section. They supply
important information about 'child' contents that inherit from them, but they 
themselves can never actually exist.
</div>

<div class="head">Inheritance</div>
<div class="info">
Distinct rooms, objects, and mobiles often share common features. When this
commonality must be defined separately for each case, it becomes a hassle. Even
worse is when it is decided that this commonality needs to be changed. NakedMud
supports inheritance for rooms, objects, and mobiles -- unique versions of
zone contents can inherit from a parent version, automatically copying over
all features of the parent to the child.
<p></p>
One application of inheritance is to store all generic information about city
streets in a parent room, and then have individual rooms within the city 
inherit from the parent. Here is an example of a parent location called
mainstreet, from which specific locations along the street will inherit.
<pre class="mud">
[mainstreet@moonhaven]
1) Abstract: yes
2) Inherits from prototypes:

3) Name
Main Street
4) Description
The street is nicely kept cobblestone.  Buildings of various sizes dot the 
north and south sides of the street.  [if is_night()] The doors and windows on 
most are shut, suggesting the town has gone to bed for the night.[/if] [if 
is_evening() or is_night()] Flames flicker at the tops of tall polls lining 
either side of the streeet.  They give the street basic illumination.[/if] 
L) Land type [City]
B) Set Bits: 
Z) Room can be reset: no
R) Room reset menu
X) Extra descriptions menu
T) Trigger menu
E) Edit exit
F) Fill exit
   north      : nowhere                   east       : nowhere             
   south      : nowhere                   west       : nowhere             
   up         : nowhere                   down       : nowhere             
   northeast  : nowhere                   southeast  : nowhere             
   southwest  : nowhere                   northwest  : nowhere             

C) Extra code

Enter choice, ? [topic] for help, or Q to quit: 
</pre>
Once the parent is created, new rooms can be edited and set to inherit from this
room. Each one that does will, by default, gain all of the information of the
parent. The information can also be extended. For instance, names can be 
over-written and descriptions can be added to. Here is an example that inherits
from mainstreet, changes its name, and adds to its description.
<pre class="mud">
[mainstreet01@moonhaven]
1) Abstract: no
2) Inherits from prototypes:
<font class="highlight">mainstreet</font>
3) Name
<font class="highlight">Mainstreet, Before the Tavern</font>
4) Description
<font class="highlight">A large tavern can be seen on the north side of the street.  [if is_evening() 
or is_night()] Silhouettes of moving people are projected against the smoky 
windows of the tavern from inside lights.[/if] The sound of music emits from 
within.</font>
L) Land type [leave unchanged]
B) Set Bits: 
Z) Room can be reset: no
R) Room reset menu
X) Extra descriptions menu
T) Trigger menu
E) Edit exit
F) Fill exit
   north      : tavern                    east       : nowhere
   south      : nowhere                   west       : nowhere
   up         : nowhere                   down       : nowhere             
   northeast  : nowhere                   southeast  : nowhere             
   southwest  : nowhere                   northwest  : nowhere             

C) Extra code

Enter choice, ? [topic] for help, or Q to quit: 
</pre>
Note that in this example, the name is changed but the description is only
<i>added to</i>. When using inheritance, editing a child's decription will
add to the parent's, not erase what was previously there. Other descriptive
fields that are edited will be overwritten. If you would prefer not to overwrite
a field, simply leave it blank in the editor.
</div>
<div class="head">Heirarchical Inheritance</div>
<div class="info">
When a parent is inherited from, all contents the parent inherits from are also
implicitly inherited. In this sense, inheritance is heirarchical. One way this
can applied is to make all lines of inheritance trace back to a single unique
content -- a generic content, so to say. If you ever want to globally apply new
functionality to a room, you can then simply add it to the generic room and all
other rooms will automatically have it.
<p></p>
If your mud implements a death system, one use of this would be to supply a
generic trigger that handles a person's death, while still leaving open the
possibility that certain rooms might change how death is handled by replacing
that trigger. To give a
classic example, some DIKU muds implement deathtraps. Normally, if a player
were to die, their corpse might be transfered to a graveyard for easy access.
However, if a player were to die in a deathtrap, their corpse remains in the
trap. And what if you want variations of death traps? Often these sort of
extentions are supplied within the game's code, using bits or flags to mark
important information. NakedMud allows you to have different rooms, mobiles, 
and objects that exhibit different behaviors through inheritance instead. The
game code need never be touched.
<p></p>
Here is an example from my mud; all chains of inheritance for rooms are rooted
at a single room: generic_room@templates. This room specifies a generic trigger
to run when someone dies, and assigns a location to transfer their corpse to.
<pre class="mud">
[generic_room@templates]
1) Abstract: yes
2) Inherits from prototypes:

3) Name

4) Description
L) Land type [leave unchanged]
B) Set Bits: 
Z) Room can be reset: no
R) Room reset menu
X) Extra descriptions menu
T) Trigger menu
E) Edit exit
F) Fill exit
   north      : nowhere                   east       : nowhere             
   south      : nowhere                   west       : nowhere             
   up         : nowhere                   down       : nowhere             
   northeast  : nowhere                   southeast  : nowhere             
   southwest  : nowhere                   northwest  : nowhere             

C) Extra code
<font class="highlight">me.attach("generic_death@templates")
me.setvar("graveyard", "graveyard@templates")</font>
</pre>
All rooms that inherit from generic_room@templates have the trigger, 
generic_death@templates attached to them. Whenever a player dies in a room 
inheriting from this one, their corpse is created and transfered to 
the standard graveyard. However, these are properties of the <i>room</i> not 
the game. So another room that inherits from this one can easily change the 
death behavior -- say, moving the corpse somewhere else -- by setting the 
graveyard variable to something new. For instance, an inherited room that had 
this line of extra code would leave the corpse where it is:
<pre class="mud">
C) Extra code
<font class="highlight">me.setvar("graveyard", me.proto)</font>
</pre>

Or perhaps you want a room where death is handled in a completely different
manner. Maybe you want dying to be the neccessary event to progress in a quest
-- for instance, in a trial of courage. Then you could detach the generic
death trigger and attach your own special one that doesn't let players die, but
instead transfers them in-tact to the next area of the quest.
<pre class="mud">
C) Extra code
<font class="highlight">me.detach("generic_death@templates")
me.attach("trial_of_courage_death@myzone")</font>
</pre>
</div>

<div class="head">Multiple Inheritance</div>
<div class="info">
Game contents can inherit from more than one parent. Rooms, objects, and mobiles
can be chimeras -- blends of multiple things, but not tracable back to a single
unique lineage. Defining multiple inheritance, like single inheritance, is done
through the OLC editors. However instead of supplying a single parent, any 
number of parents are entered, comma separated.
<pre class="mud">
[black_beetle@moonhaven]
1) Abstract: no
2) Inherits from prototypes:
<font class="highlight">generic_mob@templates, beetle@templates, hostile@templates</font>
</pre>
For instance, suppose you want to design a zone of beetles. All of those 
beetles are beetles, and thus share a unique set of properties which you might 
define in beetle@templates. However, some beetles might also be hostile, and 
have an additional hostile behavior associated with them. You could set this up
as a heirarchy, so there were two classes, one called hostile_beetle which some
of the beetles inherited from another another called friendly_beetle which the
others inherited from, both of which inherit from beetle. This would be a 
valid approach.
<p></p>
But if you have other creatures that could also be hostile -- trolls, 
necromancers, mothers -- and it would be cumbersome to make a hostile heirarchy 
for every individual type of creature. With multiple inheritance, you can just
cut to the chase and have a separate template, hostile, that any creature can
inherit from to gain scripted, hostile behavior.
<p></p>
The one caveat with multiple inheritance is that you have to be aware of
the fact that one parent may override information set by another parent (names,
attaching and detaching scripts, changing races and genders, etc). Parent 
information is applied serially, first in the list to last in the list. So the
last parent processed is the one whose information you can gaurantee will be
represented in the child. However, with careful design this should be a
non-issue.
</div>


<!-- content ends here-->
</div></div></div>

<!-- navigation starts here -->
<div class="nav-wrap"><div class="nav">
<iframe src="nav.html" height="100%" width="100%" scrolling=no frameborder=0>
</iframe>
<!-- navigation ends here -->
</div></div>

<!--div class="footer">Edit Date: Nov 15, 2008. By Geoff Hollis</div-->
</body>
</html>
				   
